// miniprogram/pages/home/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    arr: ["a", "b", "c", "b", "e", "f"],
    // 当前选中月份， 默认当月
    currentMon: "",
    // 某月的总收入和支出
    monthCost: {
      pay: 0,
      income: 0
    },
    // 某月结余  收入 - 支出
    surplus: "0.00",
    // 某月的消费数据
    monthData: [],
    // 判断是否有月份数据, 默认没有
    hasData: false
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 调用函数，获取本月日期
    this.getMonth();

    // 调用函数，获取本月数据
    this.getMsgData(this.data.currentMon);
  },


  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 获取当前用户的登录状态
    wx.getStorage({
      key: 'userLogin',
      success: res => {
        if (res.data) {
          this.getMsgData(this.data.currentMon);

          // this.setData({
          //   hasLogin: true
          // })
        }

      }
    })


    // 获取本地缓存数据，查看数据是否有更新
    wx.getStorage({
      key: "upMsgData",
      success: res => {
        if (res.data) {
          // 条件成立说明数据有更新
          // 调用函数，获取本月日期
          this.getMonth();

          // 调用函数，获取本月数据
          this.getMsgData(this.data.currentMon);

          // 数据更新完毕删除标记
          wx.removeStorage({
            key: 'upMsgData'
          })
        }
      }
    })
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },
  // 跳转到记账页面
  navToRecord() {
    //保留当前页面，跳转到应用内的某个页面。但是不能跳到 tabbar 页面。
    wx.navigateTo({
      url: "../record/index"
    })
  },
  // 获取本月日期
  getMonth() {

    // 获取时间对象
    var time = new Date();

    // 获取年份
    var y = time.getFullYear();

    // 获取月份
    var m = time.getMonth() + 1;


    // 数据响应
    this.setData({
      currentMon: m + "/" + y
    })

  },
  // 获取某月数据
  getMsgData(month) {
    // month: 查询的月份

    // 获取某月数据的原理
    // 在日期格式相同的情况下，越靠近以后的日期越大，反之越小
    // 只要集合记录的日期 大于等于查询月份第一天日期并且小于等于查询月份最后一天日期，那么就说明该记录是当前查询的月份中的数据
    // 以8月为例，查询8月数据  
    //                2021-07-24
    //2021-08-01 <= 集合记录的日期 <= 2021-08-31

    // console.log(month)

    // 获取年份月份
    // split() 方法用于把一个字符串分割成字符串数组
    var monArr = month.split("/")
    // console.log(monArr)

    // 获取查询月份的第一天日期
    var start = monArr[1] + "-" + this.addZero(monArr[0]) + "-01";


    // 获取最后一天日期 
    // new Date(年份, 月份, 0).getDate()  // 获取某月有多少天
    // 获取查询月份有多少天
    var dayNum = new Date(monArr[1], monArr[0], 0).getDate();

    var end = monArr[1] + "-" + this.addZero(monArr[0]) + "-" + dayNum;

    // console.log(start, end)

    // 对总收入和总支出清零
    this.data.monthCost.pay = 0;
    this.data.monthCost.income = 0;

    // 清空月份数据
    this.data.monthData = [];

    // 调用云函数，获取数据
    wx.cloud.callFunction({
      name: "get_msg_data",
      data: {
        startTime: start,
        endTime: end
      },
      success: res => {
        // console.log("获取数据成功==》", res)

        // 获取返回的数据
        var data = res.result.data;

        // 返回的数据长度如果为0.则说明没有数据，反之有
        this.data.hasData = data.length == 0 ? false : true;


        // 存放有消费的日期
        var timeArr = [];

        // 遍历数据累加总收入和总支出
        data.forEach(v => {

          this.data.monthCost[v.costType] += Number(v.money);

          // indexOf(要查询的元素)， 数组/字符串的查询元素Api，如果数组/字符串里存在该查询元素则返回该元素对应下标，反之不存在则返回-1

          if (timeArr.indexOf(v.date) == -1) {
            // 条件成立则说明该日期是第一次消费
            timeArr.push(v.date);
          }

        })

        // console.log("timeArr==>", timeArr)

        // 对日期数组进行排序， 日期要从大到小排列
        // sort() 数组的排序方法， 默认按元素的字符的大小 从小到大排列
        // reverse() 数组元素颠倒排序方法
        timeArr.sort().reverse();

        // console.log("timeArr==>",timeArr)

        // 根据日期数组，生成对应的数据对象
        timeArr.forEach(t => {
          // t: 当前项
          // console.log("t==>", t)
          var dataObj = {};

          // 设置日期字段
          var arr = t.split("-");
          // console.log(arr)
          dataObj.date = arr[0] + "年" + arr[1] + "月" + arr[2] + "日";


          // 设置星期字段
          // 根据日期获取星期
          var weekNum = new Date(t).getDay();
          // console.log(weekNum)
          switch (weekNum) {
            case 0:
              dataObj.week = "星期日";
              break;
            case 1:
              dataObj.week = "星期一";
              break;
            case 2:
              dataObj.week = "星期二";
              break;
            case 3:
              dataObj.week = "星期三";
              break;
            case 4:
              dataObj.week = "星期四";
              break;
            case 5:
              dataObj.week = "星期五";
              break;
            case 6:
              dataObj.week = "星期六";
              break;
          }

          // 设置一天的总收入总支出
          dataObj.pay = 0;
          dataObj.income = 0;

          // 设置存放该日期有那些消费记录
          dataObj.info = [];

          data.forEach(d => {

            if (d.date == t) {
              dataObj[d.costType] += Number(d.money);

              dataObj.info.push(d)
            }

          })

          // 保留两个小数位
          dataObj.pay = dataObj.pay.toFixed(2);
          dataObj.income = dataObj.income.toFixed(2);

          // console.log("dataObj==>",dataObj)

          this.data.monthData.push(dataObj)

        })

        // console.log("this.data.monthData==>", this.data.monthData)


        // 总收入和总支出累加完成后，计算结余
        this.data.surplus = (this.data.monthCost.income - this.data.monthCost.pay).toFixed(2);


        // 将总收入和总支出保留两个小数位
        this.data.monthCost.pay = Number(this.data.monthCost.pay).toFixed(2);
        this.data.monthCost.income = Number(this.data.monthCost.income).toFixed(2);



        // 数据响应
        this.setData({
          monthCost: this.data.monthCost,
          surplus: this.data.surplus,
          monthData: this.data.monthData,
          hasData: this.data.hasData
        })


      },
      fail: err => {
        console.log("获取数据失败==》", err)
      }
    })

  },
  // 补零函数
  addZero(num) {
    return num < 10 ? "0" + num : num;
  },
  // 选择月份事件
  selectMonth(e) {
    // 根据选择的月份改改数据格式
    var monArr = e.detail.value.split('-');
    // console.log(monArr)
    // 数据响应
    this.setData({
      currentMon: Number(monArr[1]) + "/" + monArr[0]
    })

    // 根据选择的月份获取对应数据
    this.getMsgData(this.data.currentMon);

  }
})